﻿using GTA;
using GTA.Native;
using System;
using System.Speech.Recognition;
using System.Speech.Recognition.SrgsGrammar;
using System.Windows.Forms;

namespace VoiceNameSpace
{
    public class VoiceCommandController : Script
    {
        private static Ped playerPed = Game.Player.Character;
        private static bool isVoiceRecognitionEnabled = true;
    //  private static bool isVoiceListenerActive; //for further customization
     // private static bool areVoiceCommandsEnabled = true;  //for further customization
        public Ped PP = Game.Player.Character;

        private SpeechRecognitionEngine speechRecognizer;
        private SrgsDocument speechGrammar;
        private SrgsRule commandRule;
        private SrgsOneOf commandList;

        private short currentCommandIndex = -1;

        public VoiceCommandController()
        {
            InitializeVoiceRecognition();
            Tick += OnTick;
            KeyDown += OnKeyDown;
            GTA.UI.Screen.ShowSubtitle("~g~Press the T key to enable voice recogntion\n\n\n\n\n", 5000);
        }

        private void InitializeVoiceRecognition()
        {
            speechRecognizer = new SpeechRecognitionEngine();
            speechRecognizer.SetInputToDefaultAudioDevice();

            commandRule = new SrgsRule("command");
            commandList = new SrgsOneOf("Airport", "Spawn Franklin", "Spawn Boxville");
            commandRule.Add(commandList);

            speechGrammar = new SrgsDocument();
            speechGrammar.Rules.Add(commandRule);
            speechGrammar.Root = commandRule;

            speechRecognizer.LoadGrammar(new Grammar(speechGrammar));
            speechRecognizer.RecognizeAsync();

            speechRecognizer.RecognizeCompleted += OnRecognizeCompleted;
            speechRecognizer.SpeechRecognized += OnSpeechRecognized;
        }

        private void OnRecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            if (isVoiceRecognitionEnabled)
            {
                speechRecognizer.RecognizeAsync();
            }
        }

        private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            if (isVoiceRecognitionEnabled)
            {
                switch (e.Result.Text)
                {
                    case "Airport":
                        currentCommandIndex = 0;
                        break;
                    case "Spawn Franklin":
                        currentCommandIndex = 1;
                        break;
                    case "Spawn Boxville":
                        currentCommandIndex = 2;
                        break;
                }
            }
        }

        private void OnTick(object sender, EventArgs e)
        {
            if (isVoiceRecognitionEnabled)
            {
                HandleVoiceCommands();
            }
        }

        private void HandleVoiceCommands()
        {
            switch (currentCommandIndex)
            {
                case 0:
                    Function.Call(Hash.SET_ENTITY_COORDS_NO_OFFSET, Game.Player.Character, -1022.7, -2702.2, 13.8, 0, 0, 1);
                    break;
                case 1:
                   Ped MyPed = World.CreatePed("player_one", PP.Position + PP.ForwardVector * 3f, PP.Heading + 90);
                    break;
                case 2:
                    Vehicle adderVehicle = World.CreateVehicle(VehicleHash.Boxville, playerPed.Position + playerPed.ForwardVector * 2.0f, playerPed.Heading + 90);
                    break;
            }

            // Reset command index after processing
            currentCommandIndex = -1;
        }

        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.T)
            {
                GTA.UI.Screen.ShowSubtitle("~g~You have enabled voice recogntion\n~b~Voice Commands are:\nAirport\nSpawn Franklin\nSpawn Boxville\n\n\n", 5000);
                isVoiceRecognitionEnabled = true;
            }
        }
    }
}